package procimagem;

public class MascaraMedia implements Aplicavel {

	static final double F_NORM = 1.0 / 9.0;

	private ImagemPGM imagem;

	private ImagemPGM imagemFixa;

	public MascaraMedia(ImagemPGM image) {
		int[][] pixels = new int[image.largura][image.altura];
		int[][] matriz = new int[image.largura][image.altura];
		for (int i = 0; i < matriz.length; i++) {
			for (int j = 0; j < matriz[i].length; j++) {
				pixels[i][j] = image.pixels[i][j];
				matriz[i][j] = image.pixels[i][j];
			}
		}
		this.imagem = new ImagemPGM(image.largura, image.altura,
				image.maxValue, pixels);
		this.imagemFixa = new ImagemPGM(image.largura, image.altura,
				image.maxValue, matriz);
	}

	public void aplica() {
		for (int i = 0; i < imagem.largura; i++) {
			for (int j = 0; j < imagem.altura; j++) {
				aplicaNoPixel(i, j);
			}
		}
	}

	private void aplicaNoPixel(int x, int y) {
		int soma = 0;

		soma += imagem.pixels[x][y];
		if ((x - 1) >= 0) {
			soma += imagem.pixels[x - 1][y];
		}
		if ((x + 1) < imagem.largura) {
			soma += imagem.pixels[x + 1][y];
		}
		if ((y - 1) >= 0) {
			soma += imagem.pixels[x][y - 1];
		}
		if ((y + 1) < imagem.altura) {
			soma += imagem.pixels[x][y + 1];
		}
		if (((x - 1) >= 0) && ((y - 1) >= 0)) {
			soma += imagem.pixels[x - 1][y - 1];
		}
		if (((x + 1) < imagem.largura) && ((y - 1) >= 0)) {
			soma += imagem.pixels[x + 1][y - 1];
		}
		if (((x - 1) >= 0) && ((y + 1) < imagem.altura)) {
			soma += imagem.pixels[x - 1][y + 1];
		}
		if (((x + 1) < imagem.largura) && ((y + 1) < imagem.altura)) {
			soma += imagem.pixels[x + 1][y + 1];
		}

		imagem.pixels[x][y] = (int) Math.round(soma * F_NORM);
	}

	public ImagemPGM getImage() {
		return this.imagemFixa;
	}

	public ImagemPGM getModifiedImage() {
		return this.imagem;
	}

}
